//用户服务层

package userService

import (
	"context"
	"encoding/json"
	"fmt"
	"forum/app/model/userModel"
	Redis "forum/app/redis"
	userData "forum/app/structData/user"
	"strconv"
	"time"
)

// UserResult 响应体
type UserResult struct {
	Id         int    `json:"id"`
	Username   string `json:"username"`
	Password   string `json:"password"`
	CreateTime int    `json:"create_time"`
	Status     int    `json:"status"`
}

// RegisterService 注册服务
func RegisterService(data map[string]interface{}) bool {
	if data["username"] == "" || data["password"] == "" {
		panic("用户名或密码不能为空")
	}

	if data["redPassword"] == "" {
		panic("确认密码不能为空")
	}

	if data["password"] != data["redPassword"] {
		panic("密码不一致")
	}

	// 构造查询条件
	userMap := map[string]any{
		"username": data["username"],
	}
	userInfo := userModel.GetUserInfoHandler(userMap)

	if userInfo != nil {
		panic("用户已存在")
	}
	return true
}

// LoginService 登录服务
func LoginService(data userData.LoginRequest) *userData.User {
	if data.Username == "" || data.Password == "" {
		panic("用户名或密码不能为空")
	}

	// 构造查询条件
	userMap := map[string]any{
		"username": data.Username,
		"password": data.Password,
	}
	userInfo := userModel.GetUserInfoHandler(userMap)

	if userInfo == nil {
		panic("账号或密码错误")
	}
	redis := Redis.GetRedisClient()
	// 将用户信息序列化为 JSON 字符串
	userJSON, err := json.Marshal(userInfo)
	if err != nil {
		fmt.Println("序列化用户信息失败:", err)
	}

	errs := redis.Set(context.Background(), strconv.Itoa(userInfo.Id), userJSON, 3600*time.Second).Err()
	if errs != nil {
		fmt.Println("存储用户信息到 Redis 失败:", errs)
	}

	return userInfo
}

func GetRedisUserInfo(id string) *userData.User {
	rdb := Redis.GetRedisClient() // 假设该函数返回 *redis.Client
	userInfoStr := rdb.Get(context.Background(), id)
	val, err := userInfoStr.Result()
	if err != nil {
		fmt.Println("获取Redis值失败:", err)
	}
	// 反序列化 JSON 字符串为用户对象
	var userInfo userData.User
	err = json.Unmarshal([]byte(val), &userInfo)
	if err != nil {
		fmt.Println("反序列化用户信息失败:", err)
		return nil
	}
	return &userInfo
}

// GetUserInfo 获取用户信息
func GetUserInfo(userMap map[string]any) UserResult {
	userInfo := userModel.GetUserInfoHandler(userMap)

	result := UserResult{
		Id:         userInfo.Id,
		Username:   userInfo.Username,
		Password:   userInfo.Password,
		CreateTime: userInfo.CreateTime,
		Status:     userInfo.Status,
	}

	return result
}
